// Copyright 2013 Google Inc. All Rights Reserved.
//
// This file defines system calls NaCl does not support but nacl-glibc
// does have implementations which return -1 with ENOSYS.
//
// This file should be used only for syscalls which are not defined in
// third_party/nacl-glibc/sysdeps/nacl. Such system calls are defined
// in GPL code so you cannot use NACL MOD TRACK for them.
//

#include <errno.h>
#include <grp.h>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/inotify.h>
#include <sys/mman.h>
#include <sys/prctl.h>
#include <sys/resource.h>
#include <sys/select.h>
#include <sys/sendfile.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <utime.h>

#include <irt_syscalls.h>

#define DEFINE_ENOSYS_SYSCALL(ret, name, ...)   \
  ret name(__VA_ARGS__) {                       \
    errno = ENOSYS;                             \
    return (ret) -1;                                  \
  }

DEFINE_ENOSYS_SYSCALL(void *, __brk, void *addr)
DEFINE_ENOSYS_SYSCALL(int, __fcntl64, int fd, int cmd, ...)
DEFINE_ENOSYS_SYSCALL(pid_t, __fork, void)
DEFINE_ENOSYS_SYSCALL(long, __ptrace, int request, pid_t pid,
                      void *addr, void *data)
DEFINE_ENOSYS_SYSCALL(int, __sigsuspend, const sigset_t *mask)
DEFINE_ENOSYS_SYSCALL(int, execve, const char *filename, char *const argv[],
                      char *const envp[])

DEFINE_ENOSYS_SYSCALL(pid_t, fork, void)
DEFINE_ENOSYS_SYSCALL(pid_t, getpgid, pid_t pid)
DEFINE_ENOSYS_SYSCALL(pid_t, getppid, void)
DEFINE_ENOSYS_SYSCALL(int, getrusage, int who, struct rusage *usage)
DEFINE_ENOSYS_SYSCALL(int, getrlimit, int resource, struct rlimit *rlim)
DEFINE_ENOSYS_SYSCALL(int, inotify_add_watch, int fd, const char *pathname,
                      uint32_t mask)
DEFINE_ENOSYS_SYSCALL(int, inotify_init, void)
DEFINE_ENOSYS_SYSCALL(int, inotify_rm_watch, int fd, uint32_t wd)
DEFINE_ENOSYS_SYSCALL(int, madvise, const void *addr, size_t length,
                      int advice)
DEFINE_ENOSYS_SYSCALL(int, mincore, void *addr, size_t length,
                      unsigned char *vec)
DEFINE_ENOSYS_SYSCALL(int, msync, const void *addr, size_t length, int flags)
DEFINE_ENOSYS_SYSCALL(int, personality, unsigned long persona)
DEFINE_ENOSYS_SYSCALL(int, prctl,
                      int option, ...)
DEFINE_ENOSYS_SYSCALL(int, pthread_kill, pthread_t thread, int sig)
DEFINE_ENOSYS_SYSCALL(int, pthread_sigmask,
                      int how, const sigset_t *set, sigset_t *oldset)
DEFINE_ENOSYS_SYSCALL(int, readv, int fd, const struct iovec *iov, int iovcnt)
DEFINE_ENOSYS_SYSCALL(int, sched_getparam,
                      pid_t pid, struct sched_param *param)
DEFINE_ENOSYS_SYSCALL(int, sched_getscheduler, pid_t pid)
DEFINE_ENOSYS_SYSCALL(int, sched_setscheduler,
                      pid_t pid, int policy, const struct sched_param *param)
DEFINE_ENOSYS_SYSCALL(int, setgid, gid_t gid)
DEFINE_ENOSYS_SYSCALL(int, setgroups, size_t size, const gid_t *list)
DEFINE_ENOSYS_SYSCALL(int, setitimer, int which,
                      const struct itimerval *new_value,
                      struct itimerval *old_value)
DEFINE_ENOSYS_SYSCALL(int, setpgid, pid_t pid, pid_t pgid)
DEFINE_ENOSYS_SYSCALL(int, setpriority, int which, int who, int prio)
DEFINE_ENOSYS_SYSCALL(int, setresgid, gid_t rgid, gid_t egid, gid_t sgid)
DEFINE_ENOSYS_SYSCALL(int, setsid, void)
DEFINE_ENOSYS_SYSCALL(int, settimeofday, const struct timeval *tv,
                      const struct timezone *tz)
DEFINE_ENOSYS_SYSCALL(int, sigprocmask,
                      int how, const sigset_t *set, sigset_t *oldset)
DEFINE_ENOSYS_SYSCALL(mode_t, umask, mode_t mask)
DEFINE_ENOSYS_SYSCALL(int, umount2, const char *target, int flags)
DEFINE_ENOSYS_SYSCALL(int, uname, struct utsname *buf)
DEFINE_ENOSYS_SYSCALL(int, unlinkat,
                      int dirfd, const char *pathname, int flags)
DEFINE_ENOSYS_SYSCALL(int, unshare, int flags)
DEFINE_ENOSYS_SYSCALL(pid_t, vfork, void)
